package com.ado.agea.carga;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import com.ado.agea.datos.Colecciones;
import com.ado.agea.main.Proceso;

public class CargarContratistas implements Proceso {

	private Map<String, String> conceptoNuevo;
	private Map<String, String> relacionNueva;
	private Map<String, Map> conceptosNuevos = new LinkedHashMap<String, Map>();
	private Map<String, Map> relacionesNuevas = new LinkedHashMap<String, Map>();
	int countRelaciones = Colecciones.relaciones.size() + 2;
	int countConceptos = Colecciones.conceptos.size() + 2;

	@Override
	public void procesar() {
		Map<String, String> conceptoActual;
		Map<String, String> relacionGasto = null;
		Map<String, String> relacion;
		List<String> eliminarRelacion = new ArrayList<String>();
		List<String> eliminarConcepto = new ArrayList<String>();
		String id_sup = null;
		String id_gasto;

		for (String key : Colecciones.relaciones.keySet()) {
			relacion = Colecciones.relaciones.get(key);
			System.out.printf("sup: %s, inf: %s\n", relacion.get("id_sup"), relacion.get("id_inf"));
		}

		for (String key : Colecciones.conceptos.keySet()) {
			conceptoActual = Colecciones.conceptos.get(key);
			// Buscar cada gasto por contratista (%GG)
			if (conceptoActual.get("codigo").startsWith("%") && "3".equals(conceptoActual.get("tipo"))) {
				id_gasto = conceptoActual.get("id");
				System.out.println("Id gasto por contratista a procesar: " + id_gasto + ", modelo: " + conceptoActual.get("id_modelo"));
				for (String key2 : Colecciones.relaciones.keySet()) {
					relacionGasto = Colecciones.relaciones.get(key2);
					// Buscar los padres de cada gasto por contratista (%GG)
					if (relacionGasto.get("id_inf").equals(id_gasto)) {
						id_sup = relacionGasto.get("id_sup");
						System.out.println("Id concepto padre del gasto: " + id_sup);
						// Por cada padre crear un nuevo concepto %GG
						// Crear una nueva relacion entre el nuevo concepto y el
						// padre
						conceptoNuevo = copiarConcepto(conceptoActual);
						conceptosNuevos.put(conceptoNuevo.get("id"), conceptoNuevo);
						relacionNueva = copiarRelacion(relacionGasto);
						relacionNueva.put("id_inf", conceptoNuevo.get("id"));
						System.out.println("relacion creada: " + relacionNueva.get("id_sup") + " - " + relacionNueva.get("id_inf"));
						relacionesNuevas.put(String.valueOf(countRelaciones++), relacionNueva);

						// Agregar el precio al concepto
						double factor = (Double.valueOf(conceptoNuevo.get("precio")) / 100) + 1;
						relacionNueva.put("factor", String.valueOf(factor));
						double precio = Double.valueOf(relacionNueva.get("cantidad")) * 100;
						conceptoNuevo.put("precio", String.valueOf(precio));
						relacionNueva.put("cantidad", "1");

						// Agregar las relaciones al nuevo concepto
						for (String key3 : Colecciones.relaciones.keySet()) {
							relacion = Colecciones.relaciones.get(key3);
							// Buscar conceptos que son hermanos del gasto
							if (relacion.get("id_sup").equals(id_sup)) {
								System.out.println("id hermano del gasto: " + relacion.get("id_inf"));

								if (!relacion.get("id_inf").equals(id_gasto)) {
									relacion.put("id_sup", conceptoNuevo.get("id"));
									System.out.println("id nuevo hijo del gasto: " + relacion.get("id_inf"));
									 
								} else {
									System.out.println("id_sup e id_inf relacion a eliminar: " + relacionGasto.get("id_sup") + " - " + relacionGasto.get("id_inf"));
									eliminarRelacion.add(key2);
									break;
								}
							}
						}// cierre ciclo relaciones
					}
				}// Cierre buscar padres de cada gasto por contratista
				System.out.println("id concepto a eliminar: " + conceptoActual.get("id"));
				eliminarConcepto.add(key);
			}
		}

		for (String key : eliminarRelacion) {
			Colecciones.relaciones.remove(key);
		}
		for (String key : eliminarConcepto) {
			Map<String,String> conceptoAEliminar = Colecciones.conceptos.get(key);
			String codigoMaestro = conceptoAEliminar.get("codigo");
			Colecciones.conceptos.remove(key);
			String idMaestro = Colecciones.conceptosCodigosMaestros.get(codigoMaestro);
			Colecciones.conceptosCodigosMaestros.remove(codigoMaestro);
			Colecciones.conceptosMaestros.remove(idMaestro);
		}
		Colecciones.conceptos.putAll(conceptosNuevos);
		Colecciones.relaciones.putAll(relacionesNuevas);
	}

	private Map<String, String> copiarRelacion(Map<String, String> relacionGasto) {
		Map<String, String> nuevaRelacion = new LinkedHashMap<String, String>();
		for (String key : relacionGasto.keySet()) {
			nuevaRelacion.put(key, relacionGasto.get(key));
		}
		
		return nuevaRelacion;

	}

	private Map<String, String> copiarConcepto(Map<String, String> conceptoActual) {
		Map<String, String> nuevoConcepto = new LinkedHashMap<String, String>();
		for (String key : conceptoActual.keySet()) {
			nuevoConcepto.put(key, conceptoActual.get(key));
		}
		conceptoActual.put("tipo", "2");
		int id = countConceptos++;
		nuevoConcepto.put("id", String.valueOf(id));
		nuevoConcepto.put("codigo", nuevoConcepto.get("codigo") + String.valueOf(id));
		nuevoConcepto.put("tipo", "2");
		System.out.println("concepto creado: " + nuevoConcepto.get("id"));
		return nuevoConcepto;
	}

}
